Florian Müllner [Mon, 11 May 2026 13:16:16 +0000 (15:16 +0200)]
style: Give notifications on lock screen the same width as in session
There is no strong reason to use the same width as user list and prompt
for notifications, in particular as the smaller width can make the
notification's content appear more cramped.
Instead, give notifications the same width as the message list in
the session. Especially where we reuse the same component — namely
media messages — this ensures consistent presentation.
Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/work_items/9218
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/4217>
(cherry picked from commit 6b52520d9d0c3e8d918dd87bb2a04dc3122755a5)
Alessandro Bono [Fri, 19 Jun 2026 10:43:31 +0000 (12:43 +0200)]
shell/app: Plug GTask leak
The shell_app_activate_action() function gives ownership of the task
to activate_action_get_bus_cb(), which then transfers it to
on_activate_action_cb().
Alessandro Bono [Tue, 16 Jun 2026 08:47:10 +0000 (10:47 +0200)]
background: Handle promise rejection from _loadFile()
This suppresses the following:
```
(gnome-shell:11243): Gjs-WARNING **: 19:15:39.498: Unhandled promise rejection. To suppress
this warning, add an error handler to your promise chain with .catch() or a try-catch block
around your await expression. Stack trace of the failed promise:
_loadFile@resource:///org/gnome/shell/ui/background.js:501:20
_load@resource:///org/gnome/shell/ui/background.js:531:14
_init@resource:///org/gnome/shell/ui/background.js:288:14
Background@resource:///org/gnome/shell/ui/background.js:244:4
getBackground@resource:///org/gnome/shell/ui/background.js:635:30
_createBackgroundActor@resource:///org/gnome/shell/ui/background.js:807:49
_updateBackgroundActor@resource:///org/gnome/shell/ui/background.js:779:39
_createBackgroundActor/changeSignalId<@resource:///org/gnome/shell/ui/background.js:835:18
_emitChangedSignal/this._changedIdleId<@resource:///org/gnome/shell/ui/background.js:321:18
@resource:///org/gnome/shell/ui/init.js:21:20
```
Daniel van Vugt [Tue, 9 Jun 2026 07:44:39 +0000 (15:44 +0800)]
appDisplay: Clip the icon+label to allocation when expanding
It's hard to see at regular speed, but if you slow down the animation
then it becomes apparent the label was appearing outside the tile during
expansion. This keeps it clipped inside the expanding tile.
Andre Nijman [Mon, 8 Jun 2026 05:45:01 +0000 (13:45 +0800)]
workspace: Avoid redundant boundingBox copies in window layout
WorkspaceLayout's allocation reads child.boundingBox four times for each
window on every frame of an overview transition. The getter returns a
fresh copy of the cached box on every access, so this is four throwaway
objects per window per frame feeding the garbage collector.
Read the box into a local once and use that. The values are identical;
only the per-frame allocations go away.
Tony Chen [Tue, 2 Jun 2026 20:30:18 +0000 (16:30 -0400)]
workspaceAnimation: Block workspace updates during switch
WorkspaceAnimation uses a fixed set of workspace indices to transition
between for each gesture/animation.
That means that if workspaces change during the animation, the mapping
from workspace adjustment value to the animation progress can involve
invalid indices and the animation ends on the wrong workspace.
To fix this, block workspace updates during the animation.
authPrompt: Await wiggle via show-message promise resolver
Pass promise resolver through the show-message signal so the
message queue waits for the wiggle animation to finish before scheduling
the next message timeout. This replaces the previous approach of manually
increasing the timeout duration to account for the wiggle.
animationUtils: Skip no-op wiggle to avoid cancelling pending transitions
When wiggle() is called with duration 0, the async easeAsync calls
yield between microtasks, leaving pending operations that remove
transitions on the same property. This becomes a problem when two
setMessage() calls happen in the same call stack (e.g. via
_queuePriorityMessage): the first fires a no-op wiggle(dur:0) and
the second starts the real wiggle(dur:65). When microtasks drain,
the first wiggle's pending easeAsync calls overwrite the second
wiggle's active transition, effectively cancelling the real animation.
Return early when duration is 0, since the animation is a no-op anyway.
Fixes: fdadbb7a5a2 ("animationUtils: Use easeAsync() for wiggle") Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/work_items/9207
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/4209>
When discussing goblint on Matrix, there were some concerns
around its rules for defining properties:
- having to explicitly track the last property ID, instead
of including N_PROPS in the anonymous enum
- including read-only properties in set() and write-only in get()
adds unreachable code, which is bad for code coverage
Those were considered more important than the benefit of checking
get()/set() with `-Wswitch-enum`, so at least for now stick with
the existing property conventions.
Add a configuration that enables "legacy" style for the corresponding
rules.
Sebastian Keller [Thu, 30 Apr 2026 01:44:57 +0000 (03:44 +0200)]
keyboardManager: Use layout id when reapplying
`_doApply()` expects the id rather than the layout info itself. Passing
the layout info caused the lookup to fail and the function to exit
early. This was preventing `xkb-option` or `xkb-model` settings from
applying when changed.
Fixes: 0f9034687 ("status/keyboard: Adapt to external source of keyboard layout") Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/work_items/9197
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/4205>
Running tests and builds will sometimes create either a Python
`__pycache__` directory or a Meson `.wraplock` file. Probably a good
idea to ignore those so they never get included upstream.
Sebastian Keller [Mon, 27 Apr 2026 20:53:59 +0000 (22:53 +0200)]
messageTray: Don't try to focus destroyed actor
When `ungrabFocus()` is called after hiding a notification, the previous
focus actor might have already been destroyed and trying to focus it
will trigger a gjs error.
shell/app: Be extra careful when applying GPU environment
We get the environment from SwitcherooControl as an array of
key-value pairs. When applying it, we loop over the array in pairs,
assuming that every key has a value.
While this is the expected format, it does not hurt to be defensive
against possible bugs in the service, so explicitly check that both
key and value are non-NULL before applying them.
Milan Crha [Wed, 22 Apr 2026 15:04:28 +0000 (17:04 +0200)]
endSessionDialog: Recognize scheduled updates in the Power Off dialog
The Power Off dialog should show a checkbox to install (or not) a scheduled
update, but I missed it in my previous https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/4185
animation: Prevent spinner animation from resetting
Currently, the search status spinner animation restarts on every
single keystroke while a search is in progress. This occurs because
redundant calls to `play()` replace the previous content and restart
the animation from the beginning.
This commit fixes this by ignoring redundant `play()` and `stop()` calls.
Sebastian Keller [Tue, 21 Apr 2026 11:59:51 +0000 (13:59 +0200)]
autorunManager: Connect to the correct notification signal
The signal is called `activated`. This was triggering an error and
preventing the notification from showing up when connecting an USB
drive with autorun enabled.
Milan Crha [Mon, 20 Apr 2026 10:22:48 +0000 (12:22 +0200)]
endSessionDialog: Prepare updates also in the "Restart & Install" dialog
The current code expects a checkbox to confirm update installation to be
present, but when the updates are already scheduled, it did not confirm
the actual user action for the update, aka to reboot the machine, instead
of using the previously set update action, which could be Power Off.
Milan Crha [Tue, 21 Apr 2026 15:38:10 +0000 (17:38 +0200)]
endSessionDialog: Differentiate between prepared and scheduled updates again
The prepared updates are those downloaded, while the scheduled updates
are those ready to be installed the next machine boot. The previous
gnome-software change with its OfflineUpdates D-Bus interface did not
count with it and claimed all the updates as scheduled, even when they
had been only prepared. This makes it work again by utilizing the
gnome-software changes.
screencastService: Add rate control to VA-API H.264 pipelines
The vah264enc and vah264lpenc pipelines do not specify any rate control
parameters, causing the encoder to use its default bitrate. At 4K this
results in ~12 Mbit/s recordings — roughly 18x larger than the VP8
software fallback (~630 kbit/s) with no visible quality benefit for
typical screencast content.
All other pipelines in the PIPELINES array constrain quality explicitly:
openh264enc uses qp-max=26/qp-min=26, vp8enc uses max-quantizer=17 and
buffer-size=20000. Only the two VA-API pipelines are left unconstrained.
Add rate-control=vbr bitrate=2048 target-percentage=50 to both VA-API
pipelines. This produces ~1 Mbit/s average / 2 Mbit/s peak, which is
comparable to what the other encoders produce and works across both AMD
(which lacks CQP) and Intel VA-API implementations.
Before (4K, 5s recording): 11688 kb/s, 7.2 MB
After (4K, 5s recording): 2472 kb/s, 1.6 MB
dash: Use connectObject to track signal connection to global objects
While the dash is never destroyed in vanilla gnome shell, various
extensions (such as dash-to-dock) are using this code, potentially for
every monitor.
And so we should make sure that the signals are disconnected when the
actor is destroyed.
appFavorites: Move installed-changed where it belongs
In the dash we are monitoring the installed applications and reload the
favorites, while this is not something that is related to the dash per
se, and if the AppFavorites is used to track the favorites elsewhere it
would not be updated when new favorite apps are installed.
So move the logic to AppFavorites, that will now emit a changed
event whenever any favorite changed.
appFavorites: Only emit :changed signal on changes
We were emitting the :changed signal on every setting or app-filter
change even though the actual favorites list might not have changed.
So now every time it's relevant, check if something is changed before
emitting the :changed signal.
We do a deep check of the app IDs as potentially an app could have
been removed while another is being installed during the same update
window, and the length of the IDs list wouldn't change.
When the user uses a screen reader and navigates through the
dash, each element is notified as two: one panel with no label,
and then a button with the application name as the label.
This is because each icon has the BUTTON role, but is inside a
container with the PANEL role, so each time the focus changes
from an icon to the next, there is a change in the container,
so the screen reader notifies this. But that container is
useless for the screen reader. The container always read its
label because the label_actor property is set.
In mpris we only emit "player-added" for players that can actually play,
but during NotificationBox and MessageList initialization we add them all,
including those not having being technically added.
And this may be a problem when locking the screen, since we do not want
players to show if they cannot play.
So, be consistent and expose publicly only the players that can play
fthx [Mon, 16 Feb 2026 09:41:58 +0000 (09:41 +0000)]
dash: Disconnect overview signals on destroy
While we never destroy the dash ourselves, extensions that replace it
might, so better disconnect the signals properly instead of leaking
the handlers in that case.
Ramez Medhat [Sat, 28 Mar 2026 15:14:15 +0000 (17:14 +0200)]
screenshot: Snap cursor to the center of the handle on press
When dragging the screenshot area handle from the outer sides, it is
currently impossible to move them to the edges or corners of the screen,
as the cursor is constrained to the monitor.
Fix this by snapping the cursor to the center of the handle when starting
the resize operation.
Sebastian Keller [Sat, 11 Apr 2026 13:43:05 +0000 (15:43 +0200)]
signalTracker: Add debug function to get all signal trackers
Signal trackers have been the source of difficult to identify leaks in
the past. Having access to the list of all active signal trackers at run
time without having to modify and rebuild gnome-shell can be very
valuable in identifying the source of these leaks, especially since the
steps required to trigger a leak might not always be obvious.
Sebastian Keller [Sat, 11 Apr 2026 13:02:12 +0000 (15:02 +0200)]
environment: Disconnect from transitions when stopped
Transitions don't emit a 'destroy' signal which would be used by the
SignalTracker to automatically clean up, leading to all transitions
being leaked until session shutdown.
Avoid this by manually disconnecting them when stopped.
Fixes: 240aa910d ("environment: Ignore animation events after shutdown")
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/4168>
Florian Müllner [Tue, 31 Mar 2026 19:39:05 +0000 (21:39 +0200)]
portalHelper: Set up accels from app
Setting up accels is an app action, so doing it from the app is
a more natural place than repeating it for each window (even if
the common case is a single window for the entire process lifetime).
sessionMode: Enable the networkAgent within the unlock-dialog
This ensures that selecting a password-protected
Wi-Fi network in quicksettings behaves the same
on both the initial gdm screen (before any user
has logged in, as enabled already in 4440a8210b456923678facd434ef8a23d48f63b6)
and when the screen has been locked by an already logged-in user.